package cn.lg.soar.system.general.service;

import cn.lg.soar.common.algorithm.RSAPrivateKeyCoder;
import cn.lg.soar.common.algorithm.RSAPublicKeyCoder;
import cn.lg.soar.common.algorithm.SM2Decoder;
import cn.lg.soar.common.algorithm.SM2Encoder;
import cn.lg.soar.common.util.AssertUtil;
import cn.lg.soar.common.util.data.DataUtil;

import java.io.IOException;
import java.security.NoSuchAlgorithmException;

/**
 * @author luguoxiang
 * @date 2022/1/16
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IPublicService {

    /**
     * 获取图形验证码
     * @return
     * @throws IOException
     */
    String getCaptcha(String bizType, boolean toBase64);

    /**
     * 验证图形验证码
     * @param code
     * @return
     */
    boolean checkCaptcha(String bizType, String code);

    /**
     * 获取公钥
     * @return
     * @throws NoSuchAlgorithmException
     */
    byte[] getRSAPublicKey(String bizType);

    /**
     * 获取私钥
     * @return
     */
    byte[] getRSAPrivateKey(String bizType);

    /**
     * 获取公钥base64格式
     * @param bizType
     * @return
     */
    default String getRSAPublicKeyB64(String bizType) {
        return DataUtil.BASE64EN.encodeToString(getRSAPublicKey(bizType));
    }


    /**
     * 获取公钥密码器
     * @param bizType
     * @return
     */
    default RSAPublicKeyCoder getRSAPublicKeyCoder(String bizType) {
        byte[] publicKey = getRSAPublicKey(bizType);
        AssertUtil.notNull(publicKey, "无法获取公钥");
        AssertUtil.isTrue(publicKey.length != 0, "无法获取公钥");
        return new RSAPublicKeyCoder(publicKey);
    }

    /**
     * 获取私钥密码器
     * @param bizType
     * @return
     */
    default RSAPrivateKeyCoder getRSAPrivateKeyCoder(String bizType) {
        byte[] privateKey = getRSAPrivateKey(bizType);
        AssertUtil.notNull(privateKey, "无法获取私钥");
        AssertUtil.isTrue(privateKey.length != 0, "无法获取私钥");
        return new RSAPrivateKeyCoder(privateKey);
    }

    /**
     * 获取公钥
     * @return
     * @throws NoSuchAlgorithmException
     */
    byte[] getSM2PublicKey(String bizType);

    /**
     * 获取私钥
     * @return
     */
    byte[] getSM2PrivateKey(String bizType);

    /**
     * 获取公钥base64格式
     * @param bizType
     * @return
     */
    default String getSM2PublicKeyHex(String bizType) {
        return DataUtil.byteToHex(getSM2PublicKey(bizType));
    }


    /**
     * 获取公钥密码器
     * @param bizType
     * @return
     */
    default SM2Encoder getSM2Encoder(String bizType) {
        byte[] publicKey = getSM2PublicKey(bizType);
        AssertUtil.notNull(publicKey, "无法获取公钥");
        AssertUtil.isTrue(publicKey.length != 0, "无法获取公钥");
        return new SM2Encoder(publicKey);
    }

    /**
     * 获取私钥密码器
     * @param bizType
     * @return
     */
    default SM2Decoder getSM2Decoder(String bizType) {
        byte[] privateKey = getSM2PrivateKey(bizType);
        AssertUtil.notNull(privateKey, "无法获取私钥");
        AssertUtil.isTrue(privateKey.length != 0, "无法获取私钥");
        return new SM2Decoder(privateKey);
    }

}
